import axios from 'axios'

// 创建axios实例
const apiClient = axios.create({
  baseURL: '/api',
  timeout: 60000, // 设置超时时间为60秒
  headers: {
    'Content-Type': 'application/json'
  }
})

// 请求拦截器
apiClient.interceptors.request.use(
  config => {
    // 可以在这里添加token等认证信息
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截器
apiClient.interceptors.response.use(
  response => {
    return response.data
  },
  error => {
    console.error('API请求错误:', error)
    
    // 统一错误处理
    let errorMessage = '网络请求失败，请稍后重试'
    if (error.response) {
      // 服务器返回了错误状态码
      if (error.response.status === 400) {
        errorMessage = '请求参数错误'
        // 如果有详细错误信息，使用详细信息
        if (error.response.data && error.response.data.error) {
          errorMessage = error.response.data.error
        }
      } else if (error.response.status === 401) {
        errorMessage = '未授权，请登录'
      } else if (error.response.status === 403) {
        errorMessage = '权限不足'
      } else if (error.response.status === 404) {
        errorMessage = '请求的资源不存在'
      } else if (error.response.status === 500) {
        errorMessage = '服务器内部错误'
      }
    } else if (error.request) {
      // 请求发出但没有收到响应
      errorMessage = '没有收到服务器响应，请检查网络连接'
    }
    
    return Promise.reject(new Error(errorMessage))
  }
)

// API方法
export const ttsApi = {
  /**
   * 获取可用的语言列表
   * @returns {Promise<Array>} 语言列表
   */
  getLanguages: async () => {
    try {
      const response = await apiClient.get('/languages')
      return response.languages || []
    } catch (error) {
      console.error('获取语言列表失败:', error)
      throw error
    }
  },
  
  /**
   * 获取可用的语音列表
   * @param {string} language - 语言代码
   * @returns {Promise<Array>} 语音列表
   */
  getVoices: async (language = 'en-us') => {
    try {
      const response = await apiClient.get(`/voices?language=${language}`)
      return response.voices || []
    } catch (error) {
      console.error('获取语音列表失败:', error)
      throw error
    }
  },
  
  /**
   * 文本转语音
   * @param {Object} data - 请求数据
   * @param {string} data.text - 要转换的文本
   * @param {string} data.voice - 语音
   * @param {number} data.speed - 语速
   * @param {string} data.language - 语言
   * @returns {Promise<Blob>} 音频文件
   */
  generateTTS: async (data) => {
    try {
      const response = await axios.post('/api/tts', data, {
        responseType: 'blob',
        timeout: 120000 // 增加TTS请求的超时时间
      })
      return response.data
    } catch (error) {
      console.error('语音合成失败:', error)
      throw error
    }
  },
  
  /**
   * 语音转文字
   * @param {File} file - 音频文件
   * @param {string} language - 语言代码
   * @returns {Promise<Object>} 识别结果
   */
  recognizeSpeech: async (file, language = 'en-US') => {
    try {
      const formData = new FormData()
      formData.append('file', file)
      formData.append('language', language)
      
      const response = await axios.post('/api/speech-to-text', formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        },
        timeout: 120000 // 增加语音识别请求的超时时间
      })
      
      return response.data
    } catch (error) {
      console.error('语音识别失败:', error)
      throw error
    }
  },
  
  /**
   * 单词拼读语音
   * @param {Object} data - 请求数据
   * @param {string} data.word - 要拼读的单词
   * @param {string} data.voice - 语音
   * @param {number} data.speed - 语速
   * @returns {Promise<Blob>} 音频文件
   */
  generateSpellingAudio: async (data) => {
    try {
      const response = await axios.post('/api/spelling-audio', data, {
        responseType: 'blob',
        timeout: 120000
      })
      return response.data
    } catch (error) {
      console.error('拼读语音生成失败:', error)
      throw error
    }
  },

  /**
   * 高级单词拼读语音
   * @param {Object} data - 请求数据
   * @param {string} data.word - 要拼读的单词
   * @param {string} data.mode - 拼读模式
   * @param {boolean} data.with_pronunciation - 是否包含发音说明
   * @param {string} data.letter_separator - 字母分隔符
   * @param {boolean} data.with_word_pronunciation - 是否包含单词发音
   * @param {string} data.voice - 语音
   * @param {number} data.speed - 语速
   * @returns {Promise<Object>} 包含音频文件和拼读信息的对象
   */
  generateAdvancedSpellingAudio: async (data) => {
    try {
      const response = await axios.post('/api/advanced-spelling-audio', data, {
        responseType: 'blob',
        timeout: 120000
      })
      
      // 解码base64编码的响应头
      const decodeBase64 = (encoded) => {
        try {
          const binaryString = atob(encoded);
          const bytes = new Uint8Array(binaryString.length);
          for (let i = 0; i < binaryString.length; i++) {
            bytes[i] = binaryString.charCodeAt(i);
          }
          return new TextDecoder('utf-8').decode(bytes);
        } catch (e) {
          console.warn('无法解码base64数据:', e);
          return encoded; // 解码失败时返回原始值
        }
      };
      
      // 提取并解码响应头信息
      const spellingInfo = response.headers['x-spelling-info'] ? 
        decodeBase64(response.headers['x-spelling-info']) : '';
      const spellingText = response.headers['x-spelling-text'] ? 
        decodeBase64(response.headers['x-spelling-text']) : '';
      
      // 返回音频和拼读信息
      return {
        audio: response.data,
        info: spellingInfo,
        text: spellingText
      };
    } catch (error) {
      console.error('高级拼读语音生成失败:', error);
      throw error;
    }
  }
}

export default ttsApi